/*
 * Copyright (c) 2012 Robert Burrell Donkin robertburrelldonkin.name
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
 * and associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 
 * is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 */
package walrus;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

import walrus.app.Walrus;

public class App 
{
	public static void main( String[] args ) throws Exception
    {
    	new App().configure(args).runWalrus();
    }
    
    private final Collection<WalrusOption> options;
    
    public App() {
    	options = new ArrayList<WalrusOption>();
    	options.add(new PathOption());
    	options.add(new ActOption());
    	options.add(new SubjectOption());
    	options.add(new ThreadsOption());
    	options.add(new BuffersOption());
    	options.add(new OutputOption());
    }
    
    public CommandLineParser parser() {
    	return new GnuParser();
    }
    
    public CommandLine parse(String[] args) throws ParseException {
    	return parser().parse(options(), args);
    }

	private Options options() {
		final Options results = new Options();
		for (WalrusOption option: options) {
			option.addTo(results);
		}
		return results;
	}
	
	public Walrus configure(final CommandLine line) throws ParseException {
		Walrus walrus = new Walrus();
		for (WalrusOption option: options) {
			option.configure(line, walrus);
		}
		return walrus;
	}
	
	public Walrus configure(final String[] args) throws ParseException {
		return configure(parse(args));
	}
}
